package main

import "fmt"

func main() {

	// 存放元素的容器
	// 必须指定存放元素的类型和容量（长度）
	// 数组长度是数组类型的一部分
	var a1 [3]bool // [true false true]
	var a2 [4]bool // [true false true false]
	fmt.Println("a1:%T a2:%T", a1, a2)
	// 数组初始化
	// 如果不初始化: 默认元素都是零值《布尔值: false，整型和浮点型都是0，字符串:"”)
	// 初始化1
	a1 = [3]bool{true, true, true}
	fmt.Println(a1)
	// 初始化2 ... 自动推算数组长度
	a3 := [...]int{0, 1, 2, 3, 4, 5, 5}
	fmt.Println(a3)
	// 初始化3 根据索引初始化
	a4 := [5]int{0: 1, 4: 9}
	fmt.Println(a4)
	// 数组遍历 for
	citys := [...]string{"北京", "上海", "深圳"}
	for i := 0; i < len(citys); i++ {
		fmt.Println(citys[i])
	}
	// for range
	for i, city := range citys {
		fmt.Println(city, i)
	}
	// 多维数组
	var a11 [3][2]int
	a11 = [3][2]int{
		[2]int{1, 2},
		[2]int{1, 3},
		[2]int{1, 4},
	}
	fmt.Println(a11)
	// 多维数组遍历
	for _, v := range a11 {
		fmt.Println(v)
		for _, i := range v {
			fmt.Println(i)
		}
	}

	// 数组是值类型
	b1 := [3]int{1, 2, 3}
	b2 := b1 // 拷贝到b2
	b2[0] = 100
	fmt.Println(b2, b1)
	// 求和
	var sum int = 0
	sn := [...]int{1, 2, 3, 4, 5}
	for _, v := range sn {
		sum += v
		fmt.Println(sum)
	}
	// 找出和为8的两个元素的下表分别为（0，3）和（1,2）
	// 定义两个for循环，外层的从第一个开始遍历
	//内层的for循环从外层后面的哪个开始找
	//它们两个数的和为8
	for i := 0; i < len(sn); i++ {
		for j := i + 1; j < len(sn); j++ {
			if sn[i]+sn[j] == 8 {
				fmt.Printf("(%d,%d)\n", i, j)
			}
		}
	}
	// 多维数组只有最外层才可以... 例如：[...][5]int
}
